package com.heima.xianchengchi;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class MyThreadPoolExecuror03 {
    //自己创建线程池ThreadPoolExecutor一共7个参数
    //参数一：核心线程数量（不能小于1）
    //参数二：最大线程数（不能小于等于0，最大大于等于核心线程数）
    //参数三：空闲线程最大存活时间（不能小于0）
    //参数四：时间单位（---TimeUtil中的时间参数时，分，秒...）
    //参数五：任务队列（不能为NULL)
    //参数六：创建线程工厂（不能为NULL)
    //参数七：任务的拒绝策略（不能为NULL)
    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(1,
                2,
                2,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy());
//        pool.submit(() ->
//                System.out.println(Thread.currentThread().getName() + "执行了"));
        //Thread.sleep(1000);
        //第二种默认拒绝，ThreadPoolExecutor.DiscardPolicy(),不抛出异常，不建议使用
        //第三种默认拒绝，ThreadPoolExecutor.DiscardOldestPolicy(),抛弃队列中等待最久的，把当前的加入到队列中
        //第三种默认拒绝，ThreadPoolExecutor.CallerRunsPolicy(),绕过线程池，直接执行
        for (int i = 0; i < 10; i++) {
            pool.submit(() ->
                    System.out.println(Thread.currentThread().getName() + "执行了"));
        }
        pool.shutdown();

    }
}